<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
       
        // 预解析 ：声明前置 
        // js 高级语言 ，解释性语言 
        // js 在执行的时候会有2步  第一步会解释代码（编译代码） 第二步 执行代码
        // 声明前置 

        // 一、变量的声明前置 hosting

        // 系统 会 把声明的变量在预解析的时候提前到 最开始；
        // console.log(a);
        // var a = 10;

        // var a = 10;
        /* 
        var a;



        a = 10;
        
        */

        // 二、函数的声明前置

        // 1.声明式 
        // 声明式 可以再声明之前调用 也是因为预解析 ；
        // 函数声明之后在预解析阶段 会把函数提升到最开始的位置
        // fn();
        // function fn(){
        //     console.log("fn");
        // }

        // 2.赋值式 :理解成 变量的提升；
        // console.log(fn);
        // fn();
        // undefined();

        // var fn = 123;
        // var fn = function(){
        //     console.log("1111");
        // }

        // 三、变量和函数声明前置的优先级 
            // 变量会放在最前面 之后是函数提升到变量后面，最终的结果是函数结果
        // 预解析前 
        // console.log(fn);
        // var fn = 123;
        // function fn(){
        //     console.log(111);
        // }

        // 预解析之后 
        /* 
        var fn;
        function fn(){
            console.log(111);
        }
        console.log(fn);
        fn = 123;
        */


        // 四、函数内的提升 

        // function func(){
        //     console.log(a);
        //     var a = 10;
        // }
       
        /* 
         function func(){
            var a
            console.log(a);
            a = 10;
        }
        
        
        */

        // func();


        // 函数里的变量和参数的优先级
        // 如果 既有参数 又有 变量提升会优先执行参数；
        // function func(a){
        //     console.log(a);
        //     var a = 10;
        // }
        // func(5);

        // 函数里既有 参数 又有变量 又有函数；
        // 函数内部 函数的提升优先级最高 其次 是参数 最后是 变量
        // function func(fn){
        //     console.log(fn);
        //     var fn = 10;
        //     function fn(){
        //         console.log(1111);
        //     }
        //     fn();
        // }
        // func(333);


        // 五、特殊的提升

        // 判断里的内容 会先 进行预解析 做提升操作 然后再判断 分支语句是否执行；
        console.log(a);
        if(false){
            var a  =10;
        }




    </script>
</body>
</html>